package middleware

import (
	"github.com/gin-gonic/gin"
	"giv-vue-blog/models/ctype"
	"giv-vue-blog/models/res"
	"giv-vue-blog/service/redis_ser"
	"giv-vue-blog/utils/jwts"
)

// JwtAuth 用户认证中间件
func JwtAuth() gin.HandlerFunc {
	return func(c *gin.Context) {
		//如何判断是管理员
		token := c.Request.Header.Get("token")
		if token == "" {
			res.FailedWithMsg("未携带token", c)
			c.Abort()
			return
		}
		//token校验
		claims, err := jwts.ParseToken(token)
		if err != nil {
			res.FailedWithMsg("token错误", c)
			c.Abort()
			return
		}
		//拿到token就判断token是否在redis中
		if redis_ser.CheckLogout(token) {
			res.FailedWithMsg("token已失效", c)
			c.Abort()
			return
		}
		//keys := global.Redis.Keys("logout_*").Val()
		//if utils.InList("logout_"+token, keys) {
		//	res.FailedWithMsg("token已失效", c)
		//	c.Abort()
		//	return
		//}
		//上面的是优化过后的判断
		//for _, key := range keys {
		//	if "logout_"+token == key {
		//		res.FailedWithMsg("token已失效", c)
		//		c.Abort()
		//		return
		//	}
		//}
		//登录的用户
		c.Set("claims", claims)
	}
}
func JwtAdmin() gin.HandlerFunc {
	return func(c *gin.Context) {
		//如何判断是管理员
		token := c.Request.Header.Get("token")
		if token == "" {
			res.FailedWithMsg("未携带token", c)
			c.Abort()
			return
		}
		//token校验
		claims, err := jwts.ParseToken(token)
		if err != nil {
			res.FailedWithMsg("token错误", c)
			c.Abort()
			return
		}
		//拿到token就判断token是否在redis中
		if redis_ser.CheckLogout(token) {
			res.FailedWithMsg("token已失效", c)
			c.Abort()
			return
		}
		//登录的用户 只有管理员才能使用的中间件
		if claims.Role != int(ctype.PermissionAdmin) {
			res.FailedWithMsg("权限错误", c)
			c.Abort()
			return
		}
		c.Set("claims", claims)
	}
}
